/*
 * Copyright 2012 The Netty Project
 *
 * The Netty Project licenses this file to you under the Apache License,
 * version 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at:
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */
package com.chess.echo;

import com.chess.echo.module.Dispatcher;
import com.chess.echo.session.EchoSessionManager;
import com.chess.manager.GameServerManager;
import com.sojoys.artifact.factory.session.ISession;
import com.sojoys.artifact.plugin.netty.message.NettyMessage;

import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.Attribute;
import io.netty.util.AttributeKey;

/**
 * Handler implementation for the echo server.
 */
@Sharable
public class EchoServerHandler extends ChannelInboundHandlerAdapter {
	static final AttributeKey<ISession> STATE = AttributeKey.valueOf("session");

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) {
		if (msg instanceof NettyMessage) {
			Attribute<ISession> session = ctx.channel().attr(STATE);
			ISession isession = session.get();
			if (isession == null) {
				isession = EchoSessionManager.getInstance().buildSession(ctx.channel());
				session.set(isession);
			}
			Dispatcher.getInstance().disp(isession, (NettyMessage) msg);
		}
	}

	@Override
	public void channelInactive(ChannelHandlerContext ctx) throws Exception {
		unloadSession(ctx);
		super.channelInactive(ctx);
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
		// Close the connection when an exception is raised.
		unloadSession(ctx);
		// cause.printStackTrace();
		// ctx.close();
		System.out.println("exceptionCaught");
	}

	private void unloadSession(ChannelHandlerContext ctx) {
		Attribute<ISession> session = ctx.channel().attr(STATE);
		ISession isession = session.get();
		if (isession != null) {
			isession.close();
		}
		ctx.close();
	}
}